package org.stone.project.dynamicDataSource.utils;

import cn.hutool.core.util.ObjectUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 数据源切换处理
 */
public class DynamicDataSourceContextHolder
{
    public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);

    private static String DEFAULT_DS_NAME = null;

    private static Clearable clearable = new Clearable();

    /**
     * 使用ThreadLocal维护变量，ThreadLocal为每个使用该变量的线程提供独立的变量副本，
     * 所以每一个线程都可以独立地改变自己的副本，而不会影响其它线程所对应的副本。
     */
    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();

    /**
     * 设置数据源的变量
     */
    public static Clearable setDataSourceType(String dsType)
    {
        log.info("切换到{}数据源", dsType);
        CONTEXT_HOLDER.set(dsType);
        return clearable;
    }

    /**
     * 获得数据源的变量
     */
    public static String getDataSourceType()
    {
        return CONTEXT_HOLDER.get();
    }

    /**
     * 获得数据源的变量,没有则返回默认
     */
    public static String getDataSourceTypeOrDefault()
    {
        String dsName = CONTEXT_HOLDER.get();
        if (ObjectUtil.isNotEmpty(dsName)){
            return dsName;
        }else{
            return DEFAULT_DS_NAME;
        }
    }


    /**
     * 清空数据源变量
     */
    public static void clearDataSourceType()
    {
        log.info("{}数据源切回默认", CONTEXT_HOLDER.get());
        CONTEXT_HOLDER.remove();
    }


    public static void setDefaultDsName(String defaultDsName) {
        DEFAULT_DS_NAME = defaultDsName;
    }


    //数据源切回类
    public static class Clearable implements AutoCloseable
    {
        @Override
        public void close()
        {
            DynamicDataSourceContextHolder.clearDataSourceType();
        }
    }
}
